package ThreadAndLambda.ThreadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/*
    线程池
    java.util.concurrent.Executors 线程池的工厂类，用来生成线程池
    Executors中的静态方法：
    static ExecutorService	newFixedThreadPool(int nThreads) 创建一个可重用固定线程数的线程池，以共享的无界队列方式来运行这些线程。
    参数：
        int nThreads：创建线程池中包含的线程数量
    返回值：
        ExecutorService接口，返回的是ExecutorService接口的实现类对象，可以使用ExecutorService接口接受（面向接口编程）
    java.util.concurrent.ExecutorService:线程池接口
        用来从线程池中获取线程，调用start方法，执行线程任务
         Future<?>	submit(Runnable task) 提交一个 Runnable 任务用于执行，并返回一个表示该任务的 Future。
        关闭/销毁线程池的方法
        void	shutdown() 启动一次顺序关闭，执行以前提交的任务，但不接受新任务。
     线程池的使用步骤：
     1、使用线程池的工厂类java.util.concurrent.Executors 提供的静态方法newFixedThreadPool(int nThreads)生产一个指定线程数量的线程池
     2、创建一个类，实现runnable接口，重写run方法，设置线程任务
     3、调用ExecutorService中的submit方法，传递线程任务（实现类），开启线程，执行run方法
     4、调用ExecutorService中的shutdown方法，销毁线程池（不建议执行）
*/
public class ThreadPool {
    public static void main(String[] args) {
        //1、使用线程池的工厂类java.util.concurrent.Executors 提供的静态方法newFixedThreadPool(int nThreads)生产一个指定线程数量的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        //2、创建一个类，实现runnable接口，重写run方法，设置线程任务
        //3、调用ExecutorService中的submit方法，传递线程任务（实现类），开启线程，执行run方法
        executorService.submit(new RunnableImp());
        executorService.submit(new RunnableImp());
        executorService.submit(new RunnableImp());

        //4、调用ExecutorService中的shutdown方法，销毁线程池（不建议执行）
        executorService.shutdown();

        //java.util.concurrent.RejectedExecutionException
        // executorService.submit(new RunnableImp());


    }
}
